#pragma once
#include <memory>
#include <string>
#include <queue>

#include "boost/asio.hpp"

#include "MsgNode.h"

using boost::asio::ip::tcp;

class Session
{
public:
    Session(std::shared_ptr<tcp::socket> socket);
    void Connect(const tcp::endpoint &endpoint);
    ~Session();

    void WriteToSocketErr(const std::string & buf);
    void WriteCallBackErr(const boost::system::error_code &ec,std::size_t bytes_transferred,std::shared_ptr<MsgNode> sendNode);


    void WriteToSocket(const std::string & buf);
    void WriteCallBack(const boost::system::error_code &ec,std::size_t bytes_transferred);

    void WriteAllToSocket(const std::string & buf);
    void WriteAllCallBack(const boost::system::error_code &ec,std::size_t bytes_transferred);


    //异步部分读取操作
    void ReadFromSocket();
    void ReadCallBack(const boost::system::error_code& ec, std::size_t bytes_transferred);

    //异步全部读取操作
    void ReadAllFromSocket();
    void ReadAllCallBack(const boost::system::error_code& ec, std::size_t bytes_transferred);



private:
    std::shared_ptr<tcp::socket> _socket;
    std::shared_ptr<MsgNode> _send_Node;
    //发送队列
    std::queue<std::shared_ptr<MsgNode>> _send_queue;
    bool _send_pending;
    //接收节点，每次将接收的信息存储在该节点
    std::shared_ptr<MsgNode> _recv_Node;
    bool _recv_pending;



};